package com.zhny.util;

import com.zhny.vo.XMLSite;
import org.dom4j.*;
import org.dom4j.io.*;

import java.io.File;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;
import java.util.Vector;

/**
 * @Author 侯俊杰
 * @Date 2017/11/9
 * @Time 22:15
 **/
public class XMLReaderUtil
{
    public static String pathName = "./resources/TelemeteringBaseAndSite.xml";

    /**
     * 获取xml中所有基地的名字
     * @return
     */
    public static Vector<String> getBasesNames()
    {
        Vector<String> basesNames = new Vector<String>();
        SAXReader reader = new SAXReader();
        Document document = null;
        try
        {
            document = reader.read(new File(pathName));
        } catch (DocumentException e)
        {
            e.printStackTrace();
        }

        Element root = document.getRootElement();//bases
        List<Element> list = root.elements();//这个list下现在存的是base-item
//        遍历base-item
        for (Element e:list)
        {
            Attribute attribute = e.attribute("name");
            basesNames.add(attribute.getText().trim());
        }
        return basesNames;
    }

    /**
     * 根据基地名称，获取该及地下的所有站点
     * @param baseName
     * @return Vector<XMLSite>
     */
    public static Vector<XMLSite> getSites(String baseName)
    {
        Vector<XMLSite> sites = new Vector<>();
        SAXReader reader = new SAXReader();
        Document document = null;
        try
        {
            document = reader.read(new File(pathName));
        } catch (DocumentException e)
        {
            e.printStackTrace();
        }
        Element root = document.getRootElement();//bases
        List<Element> list = root.elements();//这个list下现在存的是base-item
//        遍历base-item
        for (Element e:list)
        {
            String baseNameStr = e.attributeValue("name");
            if (baseName.trim().equals(baseNameStr.trim()))//即遍历到了该base-item
            {
                /* 这里涉及到一个知识点，dom4j中node和element的区别？
                Node是节点，一个属性、一段文字、一个注释等都是节点，而Element是元素，
                是比较完整的一个xml的元素，即我们口头上说的xml“结点”
                （此处故意使用“结”字，以示与“节点”Node区别）
                */
                //Iterator<Node> it= e.nodeIterator();

                Iterator<Element> it= e.elementIterator();
                while (it.hasNext())
                {
                    Element currentE = it.next();
                    XMLSite xmlSite = new XMLSite();
                    xmlSite.setDeviceId(currentE.attributeValue("deviceId"));
                    xmlSite.setDtu(currentE.attributeValue("dtu"));
                    xmlSite.setName(currentE.attributeValue("name"));

                    sites.add(xmlSite);
                }
            }
        }
        return sites;
    }

    /**
     * 根据基地名称，和站点名称，获取该站点的bean对象
     * @param baseName
     * @param siteName
     * @return
     */
    public static XMLSite getSite(String baseName,String siteName)
    {
        SAXReader reader = new SAXReader();
        Document document = null;
        try
        {
            document = reader.read(new File(pathName));
        } catch (DocumentException e)
        {
            e.printStackTrace();
        }
        Element root = document.getRootElement();//bases
        List<Element> list = root.elements();//这个list下现在存的是base-item
//        遍历base-item
        for (Element e:list)
        {
            String baseNameStr = e.attributeValue("name");
            if (baseName.trim().equals(baseNameStr.trim()))//即遍历到了该base-item
            {
                /* 这里涉及到一个知识点，dom4j中node和element的区别？
                Node是节点，一个属性、一段文字、一个注释等都是节点，而Element是元素，
                是比较完整的一个xml的元素，即我们口头上说的xml“结点”
                （此处故意使用“结”字，以示与“节点”Node区别）
                */
                //Iterator<Node> it= e.nodeIterator();
                Iterator<Element> it= e.elementIterator();
                while (it.hasNext())
                {
                    Element currentE = it.next();
                    if(currentE.attributeValue("name").equals(siteName))
                    {
                        XMLSite xmlSite = new XMLSite();
                        xmlSite.setDeviceId(currentE.attributeValue("deviceId"));
                        xmlSite.setDtu(currentE.attributeValue("dtu"));
                        xmlSite.setName(currentE.attributeValue("name"));
                        return xmlSite;
                    }
                }
            }
        }
        return null;
    }

    /**
     * 根据基地名称，获取所有站点的deviceFlag-deviceType 的映射表
     * @param baseName
     * @return treeMap
     */
    public static TreeMap<Integer, Short> getMapFromBaseName(String baseName)
    {
        TreeMap<Integer, Short> treeMap = new TreeMap<>();

        SAXReader reader = new SAXReader();
        Document document = null;
        try
        {
            document = reader.read(new File(pathName));
        } catch (DocumentException e)
        {
            e.printStackTrace();
        }
        Element root = document.getRootElement();//bases
        List<Element> list = root.elements();//这个list下现在存的是base-item
//        遍历base-item
        for (Element e:list)
        {
            String baseNameStr = e.attributeValue("name");
            if (baseName.trim().equals(baseNameStr.trim()))//即遍历到了该base-item
            {
                Iterator<Element> it= e.elementIterator();
                while (it.hasNext())
                {
                    Element currentE = it.next();
                    treeMap.put(Integer.parseInt(currentE.attributeValue("deviceId")),Short.parseShort(currentE.attributeValue("deviceType")));
                }
            }
        }
        return treeMap;
    }

//    下面是测试该Util可用性的psvm
//    public static void main(String[] args) throws DocumentException
//    {
//        Vector<String> basesNames = getBasesNames();
//        for (String name:basesNames)
//        {
//            System.out.println(name);
//        }
//
//
//        Vector<XMLSite> sites = getSites(basesNames.get(0)); //get回的是null
//        for (XMLSite site:sites)
//        {
//            System.out.println(site.getName()+" "+getSite(basesNames.get(0),site.getName()).getDtu());
//        }
//
//        System.out.println(getMapFromBaseName(basesNames.get(0)));
//
//    }
}
